package main

import "fmt"

/*
go没有严格的面向对象编程
不过可以仿造

使用type Student struct {}模拟对象
使用Student的方法 func NewStudent(...) Student{} 模拟构造器
使用 func (str *Student) method(...) ... {} 模拟各种方法
*/
type Student struct {
	Name    string
	Age     int
	Hobbies []string
}

//构造器
func NewStudent(name string, age int) Student {
	var hobbies []string
	return Student{
		Name:    name,
		Age:     age,
		Hobbies: hobbies,
	}
}

//各种方法
//要使用指针类型变量，使得外部更改可以生效
func (stu *Student) getName() string {
	return stu.Name
}

func (stu *Student) setName(newName string) {
	stu.Name = newName
}

func (stu *Student) addHobbies(hobbies ...string) {
	stu.Hobbies = append(stu.Hobbies, hobbies...)
}

func main() {
	student := NewStudent("sdclone", 15)
	fmt.Println(student.getName()) //sdclone
	student.setName("xyt")
	student.addHobbies("LOL")
	student.addHobbies("PUBG", "Overwatch", "football")
	fmt.Println(student) //{xyt 15 [LOL PUBG Overwatch football]}
}
